package org.jeecg.modules.paycenter.channel.bankdocking.dto;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.apache.commons.lang.StringUtils;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.HashMap;
import java.util.Map;

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "ap")
public class RespPacket {

    @XmlElement
    private String CCTransCode;
    /**固定为 0,
     * 对于返回来源非 0 的情况 即交易出现异常。
     * 对于金融类交易，当应答报文返回来源非 0 时并不能简单认为交易失败，
     * 因为此时还存在通讯异常、银行端处理超时等多种可能，由于通讯异常情况非常复杂，
     * 为稳妥起见建议 ERP 对返回来源非 0 的情况都发起对应的状态查证交易，避免出现重复支付
     * */
    @XmlElement
    private String RespSource;
    @XmlElement
    private String RespSeqNo;
    @XmlElement
    private String RespCode;

    @XmlElement
    private String RespInfo;
    @XmlElement
    private String RxtInfo;
    @XmlElement
    private String RespDate;
    @XmlElement
    private String RespTime;

    @XmlElement
    private Integer FileFlag;



    @XmlElement
    private Cmp Cmp;

    @XmlElement
    private Acc Acc;

    @XmlElement
    private Corp Corp;

    @XmlElement
    private Cme Cme;

    @XmlElement
    private Pds Pds;

    public boolean isSuccess(){
//        return "0000".equals(this.RespCode);
        return "0".equals(this.RespSource);
    }
    /**
     * 是否需要重新查询结果
     * 9999 发送报文异常
     * 0996 未配置该错误码
     * CIC1 交易状态未知
     */
    public boolean isNeedReCheck() {
        //
        if ("9999".equals(this.RespCode) || "0996".equals(this.RespCode) || "CIC1".equals(this.RespCode)) {
            return true;
        } else {
            return false;
        }
    }

    /**5.3查询金融交易处理状态（CQRT71）
     * 返回值 TransSta
     * 1 待复核 表示等待复核，交易还没有发到后台，除 了极少数客户提出 ERP 录入客户端复核 的需求外，其他客户的 ERP 交易是不需 要复核直接提交后台的，因此不会遇到这 个状态
     * 2 未复核完成 同上，表示还未完全通过复核环节
     * 3 正在发送 此为临时状态，银行系统会及时更新为最 终的处理状态
     * 4 处理成功 此为最终状态，即交易成功
     * 5 交易失败 此为最终状态，即交易失败
     * 6 落地待处理 交易等待柜员人工处理，人工处理完后系 统会自动更新为 4（成功）或 5（失败）
     * 7 预约受理 客户使用了预约功能，系统等待到了预约 时间再提交后台
     * 8 交易取消 此状态比较少见，可视为失败
     * 9 交易状态未知 需要继续查证*/
    public String getTransSta(){
        if("CQRT71".equals(CCTransCode) && this.Cmp != null){
            return this.Cmp.getTransSta();
        }
        return "";
    }

    /**
     * 查询金融交易处理状态是否成功
     * @return
     */
    public boolean isTransStaSuccess(){
        String transSta = getTransSta();
        if("4".equals(transSta)){
            return true;
        }
        return false;
    }
    public String getTransStaInfo(){
        String transSta = this.getTransSta();
        return getTransStaInfoByKey(transSta);
    }
    public static String getTransStaInfoByKey(String key){
        if(StringUtils.isEmpty(key)){
            return "";
        }
        if(transStas.containsKey(key)){
            return transStas.get(key);
        }
        return "";
    }
    private static Map<String,String> transStas = new HashMap<>();
    static {
        transStas.put("1","待复核");
        transStas.put("2","未复核完成");
        transStas.put("3","正在发送");
        transStas.put("4","处理成功");
        transStas.put("5","交易失败");
        transStas.put("6","落地待处理");
        transStas.put("7","预约受理");
        transStas.put("8","交易取消");
        transStas.put("9","交易状态未知");
    }
}
